/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package ManagedBeans;

import javax.inject.Named;
import javax.enterprise.context.SessionScoped;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import org.primefaces.event.DragDropEvent;
import org.primefaces.model.LazyDataModel;
import tp3.entities.CompteBancaire;
import tp3.entities.OperationBancaire;
import tp3.facade.CompteBancaireFacade;

/**
 *
 * @author Amaury
 */
@Named(value = "gestionnaireDeComptes")
@SessionScoped
public class GestionnaireDeComptes implements Serializable {

    @EJB
    private CompteBancaireFacade facade;
    private CompteBancaire compte;
    private String nomProprio;
    private Double solde, montant;
    private Long debiteurID, idCpteCrediter, crediteurID;
    private String typePage;
    private LazyDataModel<CompteBancaire> lazyCompte;
    private List<CompteBancaire> droppedComptes;
    private List<OperationBancaire> listOpe;
    private String nomCompteCrediteur;


    public CompteBancaireFacade getFacade() {
        return facade;
    }

    public void setFacade(CompteBancaireFacade facade) {
        this.facade = facade;
    }

    /**
     * Creates a new instance of GestionnaireDeComptes
     */
    public GestionnaireDeComptes() {
        System.out.println("WAR ///// CONSTRU");
    }

    public List<CompteBancaire> getComptesBancaires() {

        return facade.findAll();
    }

    public String showDetails(CompteBancaire cb) {
        this.compte = cb;
        this.listOpe = (List<OperationBancaire>) cb.getOperations();
        return "DetailsCompte?faces-redirect=true";
    }

    public CompteBancaire getDetails() {
        return compte;
    }

    public CompteBancaire getCompteACrediter() {
        return facade.find(idCpteCrediter);
    }

    /**
     * Action handler - met à jour la bd en fonction du client
     */
    public String update() {
        System.out.println("###UPDATE###");
        facade.edit(compte);
        return "affiche_comptes?faces-redirect=true";
    }

    /**
     * Action handler - renvoie vers la page qui affiche la liste des clients
     */
    public String list() {
        System.out.println("###LIST###");
        return "affiche_comptes?faces-redirect=true";
    }

    public void creationComptes() {
        facade.creerComptesTest();
    }

    /**
     * Ne fonctionne pas
     */
    public void creerNouveauCompte() {
        facade.create(new CompteBancaire(nomProprio, solde));
        
        FacesContext context = FacesContext.getCurrentInstance();  
           
        context.addMessage(null, new FacesMessage("Comptes", "Compte: "+nomProprio+" a été créé"));
        nomProprio = null;
        solde = 0.0;
    }

    public String transfertArgent() {
        facade.transfer(facade.find(debiteurID), facade.find(crediteurID), montant);
        System.out.println("+++ TRANSFERT  ...");
        return "affiche_comptes?faces-redirect=true";
    }

    /**
     * Ne fonctionne pas
     */
    public String supprimerCompte(CompteBancaire cpte) {
        this.compte = cpte;
        return "supprimer_comptes?faces-redirect=true";
    }

    public String goToDepot(CompteBancaire c) {
        this.compte = c;
        return "depot_retrait?faces-redirect=true&includeViewParams=true&page=depot";
    }

    public String goToRetrait(CompteBancaire c) {
        this.compte = c;
        return "depot_retrait?faces-redirect=true&includeViewParams=true&page=retrait";
    }

    public String doRetraitDepot() {

        if (typePage.equalsIgnoreCase("retrait")) {
            facade.doRetraitDepot(compte, montant * -1);
        } else if (typePage.equalsIgnoreCase("depot")) {
            facade.doRetraitDepot(compte, montant);
        }
        compte = null;
        montant = 0.0;
        return "affiche_comptes?faces-redirect=true";
    }

    public String delete() {
        facade.remove(compte);
        this.compte = null;
        return "affiche_comptes?faces-redirect=true";
    }

    public LazyDataModel<CompteBancaire> getLazyCompte() {
        if (lazyCompte == null) {
            lazyCompte = new LazyDataModel<CompteBancaire>() {
                @Override
                public List<CompteBancaire> load(int first, int pageSize, String string, boolean bln, Map<String, String> map) {
                    //System.out.println("first=" + first + ", pagesize=" + pageSize + ", sortfield=" + sortField + " sortorder=" + sortOrder + " filter:" + filters);

                    List<CompteBancaire> listcb = facade.getLazyComptes(first, pageSize);

                    this.setRowCount(facade.count()); // nombre de lignes totales (et pas par page de tableau!!)
                    this.setPageSize(pageSize);


                    return listcb;
                }
            };

        }

        //System.out.println("WAR ///// GETLAZY" + lazyCompte.getRowCount());
        return lazyCompte;
    }

    public void setLazyCompte(LazyDataModel<CompteBancaire> lazyCompte) {
        //System.out.println("WAR ///// SET LAZY" + lazyCompte.getRowCount());
        this.lazyCompte = lazyCompte;
    }
    
    public List<String> complete(String q){
         List<String> results = new ArrayList<String>();  
          droppedComptes = facade.getComptesContaining(q);
          System.out.println("COMPLETE ---- " + droppedComptes.size());
        for (CompteBancaire c : droppedComptes) {  
            results.add(c.getProprietaire() + " - " + c.getId());
        }  
        return results;
    }
    
    
    public String faireTransfert(CompteBancaire compte){
        this.compte = compte;
        return "transfert_comptes?faces-redirect=true";
    }

    public String effectuerTransfert() {
        CompteBancaire credite = getCompteACrediter();
        System.out.println("Compte: " + compte.toString() + " ,Compte a créditer: " + credite.toString() + ", montant:" + montant);
        facade.transfer(compte, credite, montant);
        compte = null;
        montant = 0.0;
        
        return "affiche_comptes?faces-redirect=true";
    }
    
     public String transferer() {
        String[] strCredit = nomCompteCrediteur.split("- ");
        String[] strDebit = nomProprio.split("- ");
        
        CompteBancaire cpteCred = facade.find(Long.parseLong(strCredit[1]));
        CompteBancaire cpteDeb = facade.find(Long.parseLong(strDebit[1]));
        
        System.out.println(strCredit[1] + ", "+strDebit[1]);    
        System.out.println("Voici les comptes: "+cpteCred.getProprietaire()+", "+cpteDeb.getProprietaire());
//        System.out.println("Compte: " + compte.toString() + " ,Compte a créditer: " + credite.toString() + ", montant:" + montant);
        facade.transfer(cpteDeb, cpteCred, montant);
        
        montant = 0.0;
        return "affiche_comptes?faces-redirect=true";
    }
    

    public void onCompteDrop(DragDropEvent ddEvent) {
        CompteBancaire cb = ((CompteBancaire) ddEvent.getData());
        droppedComptes.add(cb);
    }

    public void setDroppedComptes(List<CompteBancaire> lcb) {
        droppedComptes = lcb;
    }

    public List<CompteBancaire> getDroppedComptes() {
        return droppedComptes;
    }

    public String getNomProprio() {
        return nomProprio;
    }

    public void setNomProprio(String nomProprio) {
        this.nomProprio = nomProprio;
    }

    public Double getSolde() {
        return solde;
    }

    public void setSolde(Double solde) {
        this.solde = solde;
    }

    public CompteBancaire getCompte() {
        return compte;
    }

    public void setCompte(CompteBancaire compte) {
        this.compte = compte;
    }

    public Long getCrediteurID() {
        return crediteurID;
    }

    public void setCrediteurID(Long crediteurID) {
        this.crediteurID = crediteurID;
    }

    public Long getDebiteurID() {
        return debiteurID;
    }

    public void setDebiteurID(Long debiteurID) {
        this.debiteurID = debiteurID;
    }

    public Double getMontant() {
        return montant;
    }

    public void setMontant(Double montant) {
        this.montant = montant;
    }

    public String getTypePage() {
        return typePage;
    }

    public void setTypePage(String typePage) {
        this.typePage = typePage;
    }

    public Long getIdCpteCrediter() {
        return idCpteCrediter;
    }

    public void setIdCpteCrediter(Long id) {
        this.idCpteCrediter = id;
    }

    public List<OperationBancaire> getListOpe() {
        return listOpe;
    }

    public void setListOpe(List<OperationBancaire> listOpe) {
        this.listOpe = listOpe;
    }
    
    
    public String getNomCompteCrediteur() {
        return nomCompteCrediteur;
    }

    public void setNomCompteCrediteur(String nomCompteDebiteur) {
        this.nomCompteCrediteur = nomCompteDebiteur;
    }
    
}
